package condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Usuario;
import condominio.modelo.reservaespacio;
import condominio.modelo.EspacioComun;
import condominio.util.ConexionBD;

public class ReservaDAO extends BaseDAO {
	
	

	public void insertar(reservaespacio vo) throws DAOExcepcion {
		//System.out.println("ReservaDAO: insertar(Reserva vo)");
		String query = "INSERT INTO reservas(fechaReserva,idUsuario,idEspacioComun) VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getFecha());
			stmt.setInt(2, vo.getUsuario().getIdUsuario());
			stmt.setDouble(3, vo.getEspaciocomun().getIdespaciocomun());
			

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	

	

	
	public Collection<reservaespacio> listar() throws DAOExcepcion {
		System.out.println("ReservaDAO: listar()");
		Collection<reservaespacio> c = new ArrayList<reservaespacio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			
			String query = 
					"SELECT condominio.reservas.fechaReserva,"
					+ " condominio.usuarios.Nombre as Nombre,"
					+ " condominio.espaciocomun.nombre as espacio"
					+ " FROM condominio.espaciocomun inner join condominio.reservas"
					+ " on condominio.reservas.idEspacioComun = condominio.espaciocomun.idEspacioComun"
					+ " inner join condominio.usuarios"
					+ " on condominio.reservas.idUsuario = condominio.usuarios.idUsuario";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				reservaespacio vo = new reservaespacio();
				
				EspacioComun ec = new EspacioComun();
				//se hace el set de espacio comun
				ec.setNombre(rs.getString("espacio"));
				
				
				Usuario usuario = new Usuario();
				//se hace el set de usuario
				usuario.setNombre(rs.getString("Nombre"));
				
				
				//se hace el set de espacio de reserva
				vo.setFecha(rs.getString("fechaReserva"));
				
				vo.setEspaciocomun(ec);
				vo.setUsuario(usuario);
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<reservaespacio> buscar(Integer lugar) throws DAOExcepcion {
		System.out.println("ReservaDAO: buscar()");
		Collection<reservaespacio> c = new ArrayList<reservaespacio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			
			String query ="select fechaReserva, idEspacioComun from condominio.reservas where idEspacioComun=? ";
			stmt = con.prepareStatement(query);		
			stmt.setInt(1, lugar);
			rs = stmt.executeQuery();
			while (rs.next()) {
				reservaespacio vo = new reservaespacio();
				
				//se hace el set de espacio de reserva
				vo.setFecha(rs.getString("fechaReserva"));
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public void eliminar(String fecha, int espacioreserva) throws DAOExcepcion {
		//System.out.println("ReservaDAO: eliminar(String fecha, int espacioreserva)");
		String query = "DELETE FROM reservas where fechaReserva =? and idEspacioComun =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1,fecha);
			stmt.setInt(2, espacioreserva);
			
			

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<reservaespacio> validar() throws DAOExcepcion {
		System.out.println("ReservaDAO: validar()");
		Collection<reservaespacio> c = new ArrayList<reservaespacio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			
			String query = "SELECT fechaReserva,idUsuario, idEspacioComun FROM reservas";
					
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				reservaespacio vo = new reservaespacio();
				
				EspacioComun ec = new EspacioComun();
				//se hace el set de espacio comun
				ec.setIdespaciocomun(Integer.parseInt("idespaciocomun"));
				
				Usuario usuario = new Usuario();
				//se hace el set de usuario
				usuario.setIdUsuario(Integer.parseInt("idUsuario"));
				
				
				//se hace el set de espacio de reserva
				vo.setFecha(rs.getString("fechaReserva"));
				
				vo.setEspaciocomun(ec);
				vo.setUsuario(usuario);
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
